#include<iostream>
#include"blockqueue.hpp"
#include<vector>
#include<unistd.h>
using namespace lsh;

std::vector<pthread_t>threads;//管理所有的线程

void*producterTask(void*args)
{
    //往阻塞队列中放东西
    blockqueue<int>&que=*(blockqueue<int>*)args;
    int cnt=1;
    while(true)
    {
        que.push(cnt);
        std::cout<<"生产者放入"<<cnt++<<std::endl;
        sleep(2);
    }
    return nullptr;
}

void*consumerTask(void*args)
{
    blockqueue<int>&que=*(blockqueue<int>*)args;
    while(true)
    {
        int data=0;
        que.pop(&data);
        std::cout<<"消费者拿出"<<data<<std::endl;
    }
    return nullptr;
}

void makeProducter(int n,blockqueue<int>&que)
{
    for(int i=0;i<n;i++)
    {
        pthread_t tid=0;
        pthread_create(&tid,nullptr,producterTask,&que);
        threads.push_back(tid);
    }
}

void makeConsumer(int n,blockqueue<int>&que)
{
    for(int i=0;i<n;i++)
    {
        pthread_t tid=0;
        pthread_create(&tid,nullptr,consumerTask,&que);
        threads.push_back(tid);
    }
}

void waitThreads()
{
    for(auto&id:threads)
    {
        pthread_join(id,nullptr);
    }
}

int main()
{
    blockqueue<int>que(5);
    makeProducter(2,que);
    makeConsumer(1,que);
    waitThreads();
    return 0;
}